package result

// 返回值输出
// 渲染数据(渲染返回值)、设置响应状态码、设置响应头信息

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"github.com/go-playground/validator/v10"
	"go.uber.org/zap"
	"net/http"
)

// 200 JSON
func OK(ctx *gin.Context, val interface{}) {
	ctx.JSON(http.StatusOK, val)
}

// 200 String
func OK2String(ctx *gin.Context, val interface{}) {
	ctx.String(http.StatusOK, fmt.Sprintf("%v", val))
}

// 200 String
func OK2XML(ctx *gin.Context, val interface{}) {
	ctx.XML(http.StatusOK, val)
}

// 200 Error
func Error(ctx *gin.Context, val interface{}) {
	ctx.JSON(http.StatusOK, val)
}

// 200 ParamError 请求参数时的错误
func ParamError(ctx *gin.Context, val interface{}) {
	var ok bool
	var errValidator validator.ValidationErrors
	var err error
	jsonResult := val.(*JsonResult)
	if errValidator, ok = jsonResult.Result.(validator.ValidationErrors); ok {
		zap.L().Error("请求参数错误",
			zap.Any("errCode", jsonResult.Code),
			zap.Any("errCodeMsg", jsonResult.Code.Msg()),
			zap.Any("errValidator", errValidator))
	}
	if err, ok = jsonResult.Result.(error); ok {
		zap.L().Error("请求参数错误",
			zap.Any("errCode", jsonResult.Code),
			zap.Any("errCodeMsg", jsonResult.Code.Msg()),
			zap.Error(err))
	}
	ctx.JSON(http.StatusOK, jsonResult)
}

// 400 JSON
func BadRequest(ctx *gin.Context, val interface{}) {
	ctx.JSON(http.StatusBadRequest, val)
}

// 401 JSON
func Unauthorized(ctx *gin.Context, val interface{}) {
	ctx.JSON(http.StatusUnauthorized, val)
}

// 403 JSON
func Forbidden(ctx *gin.Context, val interface{}) {
	ctx.JSON(http.StatusForbidden, val)
}

// 404 JSON
func NotFound(ctx *gin.Context, val interface{}) {
	ctx.JSON(http.StatusNotFound, val)
}

// 500 JSON
func ServerError(ctx *gin.Context, val interface{}) {
	ctx.JSON(http.StatusInternalServerError, val)
}
